package com.legolas.config.log;

import java.util.function.Supplier;

/**
 * Created by zhangyu on 17/3/16.
 */
//追踪服务
public class Tracer {
    /*
    *Thread同步机制采用了以时间换空间方式，通过对象锁保证在同一个时间，
    *对于同一个实例对象，只有一个线程访问。
    * ThreadLocal 采用以空间换时间方式，为每一个线程都提供一份变量，
    * 各线程间同时访问互不影响。
    */
    //ThreadLocal线程的一个本地化对象
    private static final ThreadLocal<TraceContext> localCtx =
            /*withInitial:java8中新增的用于初始化ThreadLocal的方法
                Supplier：供应接口，对于给定的泛型类型产生一个实例
             */
            ThreadLocal.withInitial(new Supplier<TraceContext>() {
                @Override
                public TraceContext get() {
                    return new TraceContext();
                }
            });

    public static String getTraceId() {
        return localCtx.get().getTraceId();
    }

    public static void setTraceId(String traceId) {
        localCtx.get().setTraceId(traceId);
    }

}
